/*
 * c_dato.h
 *
 *  Created on: 27 Apr 2010
 *      Author: osky
 */


#include "c_dato.h"
#include <stdio.h>
#include <string.h>

/* Constructor para clave entera, y dato cadena */
c_dato::c_dato(char* d_clave_str, char* d_data, int largoElemento )
   {
   int j;
   
   for (j=0; j<MAX_LARGO_CLAVE_STR; j++)

   { if ( !(clave_str[j]=d_clave_str[j])) 
					    j=MAX_LARGO_CLAVE_STR; }
    
    largo_clave_str=strlen(clave_str)+1;
    
    clave=algoritmo_para_hash_2()&0xFFFF;
    data=d_data;
    this->largo_data = largoElemento;

   }

/* Devuelve un entero, resultado de la funcion de hash a la clave */
unsigned int c_dato::algoritmo_para_hash()
     {
     
    #ifdef _DEBUG_
     printf ("algoritmo_para_hash() Clave (char*) %s  Clave (long) %d \n",clave_str,clave);
    #endif
     
     return clave;
     
     }



/* Devuelve un puntero, con los datos serializados */
void* c_dato::serializar()
    {
    return (void*) data;    
    }


char* c_dato::clave_str_serializar()
    {
    return clave_str;    
    }

    
/* Devuelve la cantidad de bytes  validos de la cadena apuntada */
unsigned int c_dato::largo()
   {
   return this->largo_data;
   }

unsigned int c_dato::clave_str_largo()
   {
   return  largo_clave_str;
   }



/* Devuelve un entero, resultado de la funcion de hash a la clave */
unsigned int c_dato::algoritmo_para_hash_2()
     {
    char* name=clave_str;
     
    unsigned int hash=0;
    
    int c;
    
    while((c=*name++)) hash= (c+(hash<<6)+(hash<<16) - hash);

     #ifdef _DEBUG_
     printf ("algoritmo_para_hash_2 ()Clave (char*) %s Clave (long) %lu\n",clave_str,clave);
     #endif
     return hash;
     
     }



unsigned int c_dato::algoritmo_para_hash_3()
     {
    char* name=clave_str;
     
    unsigned int hash=0;
    unsigned int g=0;
    while(*name)
	{
	hash= (hash<<4) + *name++;
	if( (g=hash & 0xF0000000))
	hash ^= g>>24;
	hash &= ~g;	
	}


     #ifdef _DEBUG_
     printf ("algoritmo_para_hash_3() Clave (char*) %s Clave (long) %lu\n",clave_str,clave);
     #endif


     return hash;
     }



unsigned int c_dato::obtener_clave_hash()
{
return clave;
}

void c_dato::set_data(char* g_data, int g_largo){

	data = g_data;
	largo_data = g_largo;
}

